package org.xx.armory.db;

import javax.sql.DataSource;

/**
 * 事务管理器。
 * <p>负责创建和管理事务。事务管理器使用指定的上下文分配事务，同一个上下文中使用相同的事务。</p>
 */
public interface TransactionManager {
    /**
     * 获取事务管理器使用的数据源。
     *
     * @return 事务管理器使用的数据源。
     */
    DataSource getDataSource();

    /**
     * 设置事务管理器使用的数据源。
     *
     * @param dataSource
     *         事务管理器使用的数据源。
     */
    void setDataSource(
            DataSource dataSource
    );

    /**
     * 设置事务管理器创建事务时使用的默认属性。
     *
     * @param properties
     *         事务管理器创建事务时使用的默认属性。
     * @throws IllegalArgumentException
     *         如果参数{@code properties}是{@code null}。
     */
    void setProperties(
            TransactionProperties properties
    );

    /**
     * 获取当前事务，如果不存在当前事务则使用事务管理器的事务属性创建。
     *
     * @return 当前事务。
     * @throws DbException
     *         如果创建事务时出现数据库错误。
     * @see #setProperties(TransactionProperties)
     */
    Transaction current()
            throws DbException;
}
